﻿#include"C_vector.h"



void InitVector(V*v)//初始化顺序表
{
	if (v == NULL)
	{
		printf("InitVector fail\n");
		return;
	}
	v->_capacity = 10;
	v->_size = 0;
	v->_data = (DataType*)malloc( sizeof(DataType) * (v->_capacity));
	if (v->_data == NULL)
	{
		printf("InitVector malloc fail\n");
		assert(v->_data);
	}
}

void CheckVector(V* v)// 检查是否需要扩容
{
	if (v == NULL)
	{
		printf("CheckVector fail\n");
		return;
	}
	if (v->_size == v->_capacity)
	{
		DataType* tmp = (DataType*)realloc(v->_data, v->_capacity * 2 * sizeof(DataType));
		if (tmp == NULL)
		{
			printf("realloc fail\n");
			return;
		}
	}
}

void InsertVector(V* v, DataType* data, int pos)//插入数据
{
	if (v == NULL)
	{
		printf("PushVector fail\n");
		return;
	}
	if (pos > v->_size || pos < 0)
	{
		printf("插入的位置错误\n");
	}
	CheckVector(v);
	for (int i = v->_size - 1; i >= pos; i--)
	{
		strcpy(v->_data[i + 1].name, v->_data[i].name);
		strcpy(v->_data[i + 1].phone, v->_data[i].phone);
		v->_data[i + 1].num = v->_data[i].num;
	}

	strcpy(v->_data[pos].name, data->name);

	strcpy(v->_data[pos].phone, data->phone);
	v->_data[pos].num = data->num;
	v->_size++;
}

void PrintVector(V* v)//打印数据
{
	if (v == NULL)
	{
		printf("PrintVector fail\n");
		return;
	}
	if (v->_size == 0)
	{
		printf("表为空\n");
	}
	printf("序号      姓名        手机号\n");
	for (int i = 0; i < v->_size; i++)
	{
		printf("%-10d%-12s%-10s\n", 
			v->_data[i].num,v->_data[i].name, v->_data[i].phone);
	}
}

void PushVector(V* v, DataType* data)//增加数据(尾插)——增
{
	if (v == NULL)
	{
		printf("PushVector fail\n");
		return;
	}
	InsertVector(v, data, v->_size);
}

void PopVector(V* v, int pos)//删除数据——删
{
	if (v == NULL)
	{
		printf("PopVector fail\n");
		return;
	}
	if (v->_size == 0)
	{
		printf("表为空，没有数据可以删除\n");
		return;
	}
	if (pos >= v->_size || pos < 0)
	{
		printf("删除的位置错误\n");
	}
	for (int i = pos; i < v->_size-1; i++)
	{
		v->_data[i] = v->_data[i + 1];
	}
	v->_size--;
}

void FindVector(V* v, int num)//查找数据（通过序号）——查
{
	if (v == NULL)
	{
		printf("FindVector fail\n");
		return;
	}
	printf("序号      姓名        手机号\n");
	if (v->_size == 0)
	{
		printf("表为空，没有数据\n");
		return;
	}
	int judge = 1;
	for (int i = 0; i < v->_size; i++)
	{
		if (num == v->_data[i].num)
		{
			judge = 0;
			printf("%-10d%-12s%-10s\n",
			v->_data[i].num, v->_data[i].name, v->_data[i].phone);
		}
	}
	if (judge == 1)
	{
		printf("没有找到数据\n");
	}
	else
	{
		printf("上表为找到的匹配数据\n");
	}
}

void ModVector(V* v, int pos,DataType*data)//修改pos位置的数据——改
{
	if (v == NULL)
	{
		printf("ModVector fail\n");
		return;
	}
	if (pos >= v->_size || pos < 0)
	{
		printf("修改的位置错误\n");
	}
	strcpy(v->_data[pos].name, data->name);
	strcpy(v->_data[pos].phone, data->phone);
	v->_data[pos].num = data->num;
}

void DestoryVector(V* v)//销毁顺序表
{
	if (v == NULL)
	{
		printf("DestoryVector fail\n");
		assert(v);
		return;
	}
	free(v->_data);
	v->_data = NULL;
	v->_size = v->_capacity = 0;
	printf("销毁成功\n");
}













